package com.chinasoft.dataclean;

import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;

// 用户留存率分析
public class UserRetentionAnalysis {
    /**
     * 用户留存分析是一种用于衡量在特定时间段内有多少用户继续使用产品或服务的分析方法。
     * 它通常用于评估产品的粘性、用户体验的有效性以及市场策略的成功率。
     * 留存率反映了在一段时间内，吸引的新用户中有多少能够持续使用产品或服务，留存越高，意味着用户对产品越满意。
     *
     * 计算方式：留存率 =（在指定时间段后仍然活跃的用户数 / 在该时间段开始时的总用户数）×100%
     *
     * 用户留存分析的作用：
     * 降低用户流失率：通过及时发现用户流失的原因，采取相应的措施来挽留用户。
     * 优化产品开发方向：分析留存率可以帮助识别产品中的不足，改进用户体验。
     * 提升用户生命周期价值：提高留存率可以增加用户的长期价值，从而提升企业的整体收入。
     *
     * 思路：
     * 1.每天的用户去重
     * 2.自己和自己关联，过滤出未来日期的数据
     * 3.重点拿到4个指标，分别是当日的用户数，次日的用户数，3日的用户数，5日的用户数，并且是去重的
     * 4.次日，3日，5日分别除以当日的用户数拿到留存率
     */
    public static void main(String[] args) {

        SparkSession spark = SparkSession.builder().appName("Top10Category")
                .master("local[*]")
                .enableHiveSupport()
                .getOrCreate();

        Dataset<Row> ds = spark.sql("SELECT " +
                "  day, " +
                "  CAST((reten_1/reten_0)*100 AS DECIMAL(10,2)) AS reten_1_rate, " +
                "  CAST((reten_3/reten_0)*100 AS DECIMAL(10,2)) AS reten_3_rate, " +
                "  CAST((reten_5/reten_0)*100 AS DECIMAL(10,2)) AS reten_5_rate " +
                "FROM( " +
                "  SELECT " +
                "    a.day, " +
                "    count(distinct b.user_id) as reten_0, " +
                "    count(distinct if(datediff(b.day,a.day)=1,b.user_id,null)) as reten_1, " +
                "    count(distinct if(datediff(b.day,a.day)=3,b.user_id,null)) as reten_3, " +
                "    count(distinct if(datediff(b.day,a.day)=5,b.user_id,null)) as reten_5 " +
                "  FROM (SELECT user_id,day FROM dwd.dwd_behavior_info GROUP BY user_id,day) a " +
                "  JOIN (SELECT user_id,day FROM dwd.dwd_behavior_info GROUP BY user_id,day) b " +
                "  ON a.user_id = b.user_id " +
                "  WHERE a.day <= b.day " +
                "  GROUP BY a.day " +
                ") t");

        ds.write()
                .format("jdbc")
                .option("url","jdbc:mysql://douni43:3306/analyze")
                .option("dbtable","user_retention_analysis")
                .option("user","root")
                .option("password","123456")
                .option("driver","com.mysql.jdbc.Driver")
                .mode("overwrite")
                .save();

        spark.close();
    }
}
